/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import controlador.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidad.Empresa;
import entidad.Empleados;
import java.util.ArrayList;
import java.util.Collection;
import entidad.Lotes;
import entidad.Sucursales;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author a
 */
public class SucursalesJpaController implements Serializable {

    public SucursalesJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Sucursales sucursales) {
        if (sucursales.getEmpleadosCollection() == null) {
            sucursales.setEmpleadosCollection(new ArrayList<Empleados>());
        }
        if (sucursales.getLotesCollection() == null) {
            sucursales.setLotesCollection(new ArrayList<Lotes>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Empresa empresaidEmpresa = sucursales.getEmpresaidEmpresa();
            if (empresaidEmpresa != null) {
                empresaidEmpresa = em.getReference(empresaidEmpresa.getClass(), empresaidEmpresa.getIdEmpresa());
                sucursales.setEmpresaidEmpresa(empresaidEmpresa);
            }
            Collection<Empleados> attachedEmpleadosCollection = new ArrayList<Empleados>();
            for (Empleados empleadosCollectionEmpleadosToAttach : sucursales.getEmpleadosCollection()) {
                empleadosCollectionEmpleadosToAttach = em.getReference(empleadosCollectionEmpleadosToAttach.getClass(), empleadosCollectionEmpleadosToAttach.getIdEmpleados());
                attachedEmpleadosCollection.add(empleadosCollectionEmpleadosToAttach);
            }
            sucursales.setEmpleadosCollection(attachedEmpleadosCollection);
            Collection<Lotes> attachedLotesCollection = new ArrayList<Lotes>();
            for (Lotes lotesCollectionLotesToAttach : sucursales.getLotesCollection()) {
                lotesCollectionLotesToAttach = em.getReference(lotesCollectionLotesToAttach.getClass(), lotesCollectionLotesToAttach.getIdLotes());
                attachedLotesCollection.add(lotesCollectionLotesToAttach);
            }
            sucursales.setLotesCollection(attachedLotesCollection);
            em.persist(sucursales);
            if (empresaidEmpresa != null) {
                empresaidEmpresa.getSucursalesCollection().add(sucursales);
                empresaidEmpresa = em.merge(empresaidEmpresa);
            }
            for (Empleados empleadosCollectionEmpleados : sucursales.getEmpleadosCollection()) {
                Sucursales oldSucursalidSucursalOfEmpleadosCollectionEmpleados = empleadosCollectionEmpleados.getSucursalidSucursal();
                empleadosCollectionEmpleados.setSucursalidSucursal(sucursales);
                empleadosCollectionEmpleados = em.merge(empleadosCollectionEmpleados);
                if (oldSucursalidSucursalOfEmpleadosCollectionEmpleados != null) {
                    oldSucursalidSucursalOfEmpleadosCollectionEmpleados.getEmpleadosCollection().remove(empleadosCollectionEmpleados);
                    oldSucursalidSucursalOfEmpleadosCollectionEmpleados = em.merge(oldSucursalidSucursalOfEmpleadosCollectionEmpleados);
                }
            }
            for (Lotes lotesCollectionLotes : sucursales.getLotesCollection()) {
                Sucursales oldSucursalesidSucursalesOfLotesCollectionLotes = lotesCollectionLotes.getSucursalesidSucursales();
                lotesCollectionLotes.setSucursalesidSucursales(sucursales);
                lotesCollectionLotes = em.merge(lotesCollectionLotes);
                if (oldSucursalesidSucursalesOfLotesCollectionLotes != null) {
                    oldSucursalesidSucursalesOfLotesCollectionLotes.getLotesCollection().remove(lotesCollectionLotes);
                    oldSucursalesidSucursalesOfLotesCollectionLotes = em.merge(oldSucursalesidSucursalesOfLotesCollectionLotes);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Sucursales sucursales) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Sucursales persistentSucursales = em.find(Sucursales.class, sucursales.getIdSucursales());
            Empresa empresaidEmpresaOld = persistentSucursales.getEmpresaidEmpresa();
            Empresa empresaidEmpresaNew = sucursales.getEmpresaidEmpresa();
            Collection<Empleados> empleadosCollectionOld = persistentSucursales.getEmpleadosCollection();
            Collection<Empleados> empleadosCollectionNew = sucursales.getEmpleadosCollection();
            Collection<Lotes> lotesCollectionOld = persistentSucursales.getLotesCollection();
            Collection<Lotes> lotesCollectionNew = sucursales.getLotesCollection();
            if (empresaidEmpresaNew != null) {
                empresaidEmpresaNew = em.getReference(empresaidEmpresaNew.getClass(), empresaidEmpresaNew.getIdEmpresa());
                sucursales.setEmpresaidEmpresa(empresaidEmpresaNew);
            }
            Collection<Empleados> attachedEmpleadosCollectionNew = new ArrayList<Empleados>();
            for (Empleados empleadosCollectionNewEmpleadosToAttach : empleadosCollectionNew) {
                empleadosCollectionNewEmpleadosToAttach = em.getReference(empleadosCollectionNewEmpleadosToAttach.getClass(), empleadosCollectionNewEmpleadosToAttach.getIdEmpleados());
                attachedEmpleadosCollectionNew.add(empleadosCollectionNewEmpleadosToAttach);
            }
            empleadosCollectionNew = attachedEmpleadosCollectionNew;
            sucursales.setEmpleadosCollection(empleadosCollectionNew);
            Collection<Lotes> attachedLotesCollectionNew = new ArrayList<Lotes>();
            for (Lotes lotesCollectionNewLotesToAttach : lotesCollectionNew) {
                lotesCollectionNewLotesToAttach = em.getReference(lotesCollectionNewLotesToAttach.getClass(), lotesCollectionNewLotesToAttach.getIdLotes());
                attachedLotesCollectionNew.add(lotesCollectionNewLotesToAttach);
            }
            lotesCollectionNew = attachedLotesCollectionNew;
            sucursales.setLotesCollection(lotesCollectionNew);
            sucursales = em.merge(sucursales);
            if (empresaidEmpresaOld != null && !empresaidEmpresaOld.equals(empresaidEmpresaNew)) {
                empresaidEmpresaOld.getSucursalesCollection().remove(sucursales);
                empresaidEmpresaOld = em.merge(empresaidEmpresaOld);
            }
            if (empresaidEmpresaNew != null && !empresaidEmpresaNew.equals(empresaidEmpresaOld)) {
                empresaidEmpresaNew.getSucursalesCollection().add(sucursales);
                empresaidEmpresaNew = em.merge(empresaidEmpresaNew);
            }
            for (Empleados empleadosCollectionOldEmpleados : empleadosCollectionOld) {
                if (!empleadosCollectionNew.contains(empleadosCollectionOldEmpleados)) {
                    empleadosCollectionOldEmpleados.setSucursalidSucursal(null);
                    empleadosCollectionOldEmpleados = em.merge(empleadosCollectionOldEmpleados);
                }
            }
            for (Empleados empleadosCollectionNewEmpleados : empleadosCollectionNew) {
                if (!empleadosCollectionOld.contains(empleadosCollectionNewEmpleados)) {
                    Sucursales oldSucursalidSucursalOfEmpleadosCollectionNewEmpleados = empleadosCollectionNewEmpleados.getSucursalidSucursal();
                    empleadosCollectionNewEmpleados.setSucursalidSucursal(sucursales);
                    empleadosCollectionNewEmpleados = em.merge(empleadosCollectionNewEmpleados);
                    if (oldSucursalidSucursalOfEmpleadosCollectionNewEmpleados != null && !oldSucursalidSucursalOfEmpleadosCollectionNewEmpleados.equals(sucursales)) {
                        oldSucursalidSucursalOfEmpleadosCollectionNewEmpleados.getEmpleadosCollection().remove(empleadosCollectionNewEmpleados);
                        oldSucursalidSucursalOfEmpleadosCollectionNewEmpleados = em.merge(oldSucursalidSucursalOfEmpleadosCollectionNewEmpleados);
                    }
                }
            }
            for (Lotes lotesCollectionOldLotes : lotesCollectionOld) {
                if (!lotesCollectionNew.contains(lotesCollectionOldLotes)) {
                    lotesCollectionOldLotes.setSucursalesidSucursales(null);
                    lotesCollectionOldLotes = em.merge(lotesCollectionOldLotes);
                }
            }
            for (Lotes lotesCollectionNewLotes : lotesCollectionNew) {
                if (!lotesCollectionOld.contains(lotesCollectionNewLotes)) {
                    Sucursales oldSucursalesidSucursalesOfLotesCollectionNewLotes = lotesCollectionNewLotes.getSucursalesidSucursales();
                    lotesCollectionNewLotes.setSucursalesidSucursales(sucursales);
                    lotesCollectionNewLotes = em.merge(lotesCollectionNewLotes);
                    if (oldSucursalesidSucursalesOfLotesCollectionNewLotes != null && !oldSucursalesidSucursalesOfLotesCollectionNewLotes.equals(sucursales)) {
                        oldSucursalesidSucursalesOfLotesCollectionNewLotes.getLotesCollection().remove(lotesCollectionNewLotes);
                        oldSucursalesidSucursalesOfLotesCollectionNewLotes = em.merge(oldSucursalesidSucursalesOfLotesCollectionNewLotes);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = sucursales.getIdSucursales();
                if (findSucursales(id) == null) {
                    throw new NonexistentEntityException("The sucursales with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Sucursales sucursales;
            try {
                sucursales = em.getReference(Sucursales.class, id);
                sucursales.getIdSucursales();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The sucursales with id " + id + " no longer exists.", enfe);
            }
            Empresa empresaidEmpresa = sucursales.getEmpresaidEmpresa();
            if (empresaidEmpresa != null) {
                empresaidEmpresa.getSucursalesCollection().remove(sucursales);
                empresaidEmpresa = em.merge(empresaidEmpresa);
            }
            Collection<Empleados> empleadosCollection = sucursales.getEmpleadosCollection();
            for (Empleados empleadosCollectionEmpleados : empleadosCollection) {
                empleadosCollectionEmpleados.setSucursalidSucursal(null);
                empleadosCollectionEmpleados = em.merge(empleadosCollectionEmpleados);
            }
            Collection<Lotes> lotesCollection = sucursales.getLotesCollection();
            for (Lotes lotesCollectionLotes : lotesCollection) {
                lotesCollectionLotes.setSucursalesidSucursales(null);
                lotesCollectionLotes = em.merge(lotesCollectionLotes);
            }
            em.remove(sucursales);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Sucursales> findSucursalesEntities() {
        return findSucursalesEntities(true, -1, -1);
    }

    public List<Sucursales> findSucursalesEntities(int maxResults, int firstResult) {
        return findSucursalesEntities(false, maxResults, firstResult);
    }

    private List<Sucursales> findSucursalesEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Sucursales.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Sucursales findSucursales(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Sucursales.class, id);
        } finally {
            em.close();
        }
    }

    public int getSucursalesCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Sucursales> rt = cq.from(Sucursales.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
